package com.bjpowernode.gateway.common.utils;

import org.apache.commons.codec.binary.Base64;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public class Pkipair {


	/**
	 * 创建密钥
	 * @param signMsg
	 * @return
	 */
	public String signMsg( String signMsg , String privateFile) {

		String base64 = "";
		try {
			// 创建了一个KeyStore对象的实例，该对象使用PKCS#12（也称为P12或PFX）格式。
			KeyStore ks = KeyStore.getInstance("PKCS12");
			// 读取 私钥文件(密钥)
			String file = Pkipair.class.getResource(privateFile).getPath().replaceAll("%20", " ");
			System.out.println(file);
			// 将读取到的密钥放入输入流
			FileInputStream ksfis = new FileInputStream(file);
			// 缓存输入流
			BufferedInputStream ksbufin = new BufferedInputStream(ksfis);

			char[] keyPwd = "123456".toCharArray();
			//  char[] keyPwd = "YaoJiaNiLOVE999Year".toCharArray();
			// 给创建的 keyStore 对象实例加载 -> 密钥 : 密码
			ks.load(ksbufin, keyPwd);
			// 生成key
			PrivateKey priK = (PrivateKey) ks.getKey("test-alias", keyPwd);
			Signature signature = Signature.getInstance("SHA256withRSA");
			signature.initSign(priK);
			signature.update(signMsg.getBytes("utf-8"));

			// sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
			// base64 = encoder.encode(signature.sign());
			Base64 encoder = new Base64();
			base64 = encoder.encodeAsString(signature.sign());

		} catch(FileNotFoundException e){
			System.out.println("123");
		}catch (Exception ex) {
			ex.printStackTrace();
		}
		System.out.println("test = "+base64);
		return base64;
	}
	public boolean enCodeByCer( String val, String msg) {
		boolean flag = false;
		try {
			// 使用Pkipair.class.getResource("CFCA_sandbox.cer").toURI().getPath()获取公钥证书文件的路径。
			String file = Pkipair.class.getResource("CFCA_sandbox.cer").toURI().getPath();//99bill[1].cert.rsa.20140803.cer
			System.out.println(file);
			// 使用FileInputStream打开证书文件。
			FileInputStream inStream = new FileInputStream(file);

			// 加载和解析证书
			// 创建一个CertificateFactory实例，用于加载X.509证书。
			CertificateFactory cf = CertificateFactory.getInstance("X.509");
			// 使用generateCertificate(inStream)方法从输入流中加载证书，并将其转换为X509Certificate对象。
			X509Certificate cert = (X509Certificate) cf.generateCertificate(inStream);
			// 从证书中获取公钥（PublicKey）。
			PublicKey pk = cert.getPublicKey();

			// 解码和验证签名
			// 创建一个Signature实例，使用SHA256withRSA算法。
			Signature signature = Signature.getInstance("SHA256withRSA");
			// 使用公钥初始化签名对象以进行验证（signature.initVerify(pk)）。
			signature.initVerify(pk);
			// 使用待验证的数据（val）更新签名对象（signature.update(val.getBytes())）。
			signature.update(val.getBytes());

			// 解码和验证签名
			Base64 base64 = new Base64();
			byte[] decode = base64.decode(msg);
			flag = signature.verify(decode);
			/*// 使用sun.misc.BASE64Decoder解码Base64编码的签名（msg）。
			sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
			System.out.println(new String(decoder.decodeBuffer(msg)));
			// 使用signature.verify(...)方法验证解码后的签名是否与数据匹配。并将验证结果存储在flag变量中。
			flag = signature.verify(decoder.decodeBuffer(msg));*/
			System.out.println(flag);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("no");
		}
		return flag;
	}

}
